//
// Created by 32827 on 2023/11/29.
//

#ifndef YZFRAME_YZF_SPI_H
#define YZFRAME_YZF_SPI_H
#include "yzf.h"

enum YZF_SPI_BR{
    YZF_SPI_PLCK_2=0,
    YZF_SPI_PLCK_4=1,
    YZF_SPI_PLCK_8=2,
    YZF_SPI_PLCK_16=3,
    YZF_SPI_PLCK_32=4,
    YZF_SPI_PLCK_64=5,
    YZF_SPI_PLCK_128=6,
    YZF_SPI_PLCK_256=7
};
typedef enum YZF_SPI_BR YZF_SPI_BR;

YZF_RESULT yzf_spi_open_source_clock(YZF_SPI_POINTER spi);
//在改变CPOL/CPHA位之前，必须清除SPE位将SPI禁止。
//时钟极性置1，时钟空闲为高电平
YZF_RESULT yzf_spi_set_cpol_HIGH(YZF_SPI_POINTER spi);
//时钟极性清0，时钟空闲为低电平
YZF_RESULT yzf_spi_set_cpol_LOW(YZF_SPI_POINTER spi);
//时钟相位置1 在第二个边沿采样
YZF_RESULT yzf_spi_set_cpha_second(YZF_SPI_POINTER spi);
//时钟相位清0 在第一个边沿采样
YZF_RESULT yzf_spi_set_cpha_first(YZF_SPI_POINTER spi);
//数据高有效位先
YZF_RESULT yzf_spi_set_MSBFIRST(YZF_SPI_POINTER spi);
//数据低有效位先
YZF_RESULT yzf_spi_set_LSBFIRST(YZF_SPI_POINTER spi);
//8位数据帧
YZF_RESULT yzf_spi_set_DFF_8bits(YZF_SPI_POINTER spi);
//16位数据帧
YZF_RESULT yzf_spi_set_DFF_16bits(YZF_SPI_POINTER spi);
//TXE中断使能
YZF_RESULT yzf_spi_enable_txe_interrupt(YZF_SPI_POINTER spi);
//TXE中断失效
YZF_RESULT yzf_spi_disable_txe_interrupt(YZF_SPI_POINTER spi);
//TXE FLAG获取
YZF_BOOL yzf_spi_flag_txe(YZF_SPI_POINTER spi);
//RXNE中断使能
YZF_RESULT yzf_spi_enable_rxne_interrupt(YZF_SPI_POINTER spi);
//RXNE中断失效
YZF_RESULT yzf_spi_disable_rxne_interrupt(YZF_SPI_POINTER spi);
//RXNE FLAG获取
YZF_BOOL yzf_spi_flag_rxne(YZF_SPI_POINTER spi);

//错误中断使能
YZF_RESULT yzf_spi_enable_err_interrupt(YZF_SPI_POINTER spi);
//错误中断失效
YZF_RESULT yzf_spi_disable_err_interrupt(YZF_SPI_POINTER spi);

//BSY FLAG获取
YZF_BOOL yzf_spi_flag_bsy(YZF_SPI_POINTER spi);
//OVR FLAG获取
YZF_BOOL yzf_spi_flag_ovr(YZF_SPI_POINTER spi);
//MODF FLAG模式错误获取
YZF_BOOL yzf_spi_flag_modf(YZF_SPI_POINTER spi);
//CRCERR FLAG获取
YZF_BOOL yzf_spi_flag_crcerr(YZF_SPI_POINTER spi);
//UDR FLAG获取 下溢标志
YZF_BOOL yzf_spi_flag_udr(YZF_SPI_POINTER spi);
//CHSIDE FLAG获取 声道
YZF_BOOL yzf_spi_flag_chside(YZF_SPI_POINTER spi);


//读取数据 会清除RXNE位
uint8_t yzf_spi_read_byte(YZF_SPI_POINTER spi);
uint16_t yzf_spi_read_word(YZF_SPI_POINTER spi);
//写入数据 会清除TXE位
YZF_RESULT yzf_spi_write_byte(YZF_SPI_POINTER spi,uint8_t byte);
YZF_RESULT yzf_spi_write_word(YZF_SPI_POINTER spi,uint16_t word);

//1条时钟线和1条双向数据线 使能
YZF_RESULT yzf_spi_enable_BIDI(YZF_SPI_POINTER spi);
YZF_RESULT yzf_spi_disable_BIDI(YZF_SPI_POINTER spi);
//BIDI发送使能
YZF_RESULT yzf_spi_enable_BIDIO(YZF_SPI_POINTER spi);
YZF_RESULT yzf_spi_disable_BIDIO(YZF_SPI_POINTER spi);
//单线单向 接收 只接收
YZF_RESULT yzf_spi_enable_RXONLY(YZF_SPI_POINTER spi);
YZF_RESULT yzf_spi_disable_RXONLY(YZF_SPI_POINTER spi);

//spi使能
YZF_RESULT yzf_spi_enable(YZF_SPI_POINTER spi);
//spi失效
YZF_RESULT yzf_spi_disable(YZF_SPI_POINTER spi);
YZF_BOOL  yzf_spi_is_enabled(YZF_SPI_POINTER spi);

//硬件CRC使能
YZF_RESULT yzf_spi_crc_enable(YZF_SPI_POINTER spi);
//硬件CRC失效
YZF_RESULT yzf_spi_crc_disable(YZF_SPI_POINTER spi);
//下一个输出CRC
YZF_RESULT yzf_spi_crc_next(YZF_SPI_POINTER spi);
//CRC公式
YZF_RESULT yzf_spi_set_crc_poly(YZF_SPI_POINTER spi,uint16_t poly);
//CRC接收寄存器
uint16_t yzf_spi_get_crc_rx(YZF_SPI_POINTER spi);
//CRC发送寄存器
YZF_RESULT yzf_spi_set_crc_tx(YZF_SPI_POINTER spi,uint16_t crc);


//软件nss管理
YZF_RESULT yzf_spi_enable_ssm(YZF_SPI_POINTER spi);
YZF_RESULT yzf_spi_disable_ssm(YZF_SPI_POINTER spi);
//内部从设备选择
YZF_RESULT yzf_spi_select_ssi(YZF_SPI_POINTER spi);
YZF_RESULT yzf_spi_disSelect_ssi(YZF_SPI_POINTER spi);

//波特控制
YZF_RESULT yzf_spi_set_br(YZF_SPI_POINTER spi,YZF_SPI_BR br);
//NSS输出使能
YZF_RESULT yzf_spi_enable_sso(YZF_SPI_POINTER spi);
YZF_RESULT yzf_spi_disable_sso(YZF_SPI_POINTER spi);
//DMA使能
YZF_RESULT yzf_spi_enable_tx_dma(YZF_SPI_POINTER spi);
YZF_RESULT yzf_spi_disable_tx_dma(YZF_SPI_POINTER spi);
YZF_RESULT yzf_spi_enable_rx_dma(YZF_SPI_POINTER spi);
YZF_RESULT yzf_spi_disable_rx_dma(YZF_SPI_POINTER spi);

//主从设置
YZF_RESULT yzf_spi_set_master(YZF_SPI_POINTER spi);
YZF_RESULT yzf_spi_set_slave(YZF_SPI_POINTER spi);
//TODO: 完善I2S操作
#endif //YZFRAME_YZF_SPI_H